import * as SecureStore from 'expo-secure-store';

// 定义存储键名
const AUTH_TOKEN_KEY = 'auth_token';
const USER_INFO_KEY = 'user_info';

/**
 * 存储认证令牌
 * @param token JWT令牌
 */
export async function saveToken(token: string): Promise<void> {
  try {
    await SecureStore.setItemAsync(AUTH_TOKEN_KEY, token);
  } catch (error) {
    console.error('保存令牌失败:', error);
    throw error;
  }
}

/**
 * 获取存储的认证令牌
 * @returns 存储的令牌，如果不存在则返回null
 */
export async function getToken(): Promise<string | null> {
  try {
    return await SecureStore.getItemAsync(AUTH_TOKEN_KEY);
  } catch (error) {
    console.error('获取令牌失败:', error);
    return null;
  }
}

/**
 * 为API请求准备认证头
 * 由于后端只支持NextAuth JWT认证，这个函数返回兼容的认证头
 * @returns 认证头部对象
 */
export async function getAuthHeaders(): Promise<Record<string, string>> {
  try {
    const token = await getToken();
    if (!token) {
      return {};
    }
    
    // 后端中间件检查的是bearer令牌，我们在这里使用标准格式
    return {
      'Authorization': `Bearer ${token}`
    };
  } catch (error) {
    console.error('准备认证头失败:', error);
    return {};
  }
}

/**
 * 删除存储的认证令牌
 */
export async function removeToken(): Promise<void> {
  try {
    await SecureStore.deleteItemAsync(AUTH_TOKEN_KEY);
  } catch (error) {
    console.error('删除令牌失败:', error);
  }
}

/**
 * 存储用户信息
 * @param userInfo 用户信息对象
 */
export async function saveUserInfo(userInfo: any): Promise<void> {
  try {
    const userInfoString = JSON.stringify(userInfo);
    await SecureStore.setItemAsync(USER_INFO_KEY, userInfoString);
  } catch (error) {
    console.error('保存用户信息失败:', error);
    throw error;
  }
}

/**
 * 获取存储的用户信息
 * @returns 用户信息对象，如果不存在则返回null
 */
export async function getUserInfo(): Promise<any | null> {
  try {
    const userInfoString = await SecureStore.getItemAsync(USER_INFO_KEY);
    if (!userInfoString) return null;
    return JSON.parse(userInfoString);
  } catch (error) {
    console.error('获取用户信息失败:', error);
    return null;
  }
}

/**
 * 删除存储的用户信息
 */
export async function removeUserInfo(): Promise<void> {
  try {
    await SecureStore.deleteItemAsync(USER_INFO_KEY);
  } catch (error) {
    console.error('删除用户信息失败:', error);
  }
}

/**
 * 清除所有认证相关存储
 */
export async function clearAuthStorage(): Promise<void> {
  await Promise.all([removeToken(), removeUserInfo()]);
}